package fr.lille.inria.adam.lifl.EcoGardeInventory.Activities;

import fr.lille.inria.adam.lifl.EcoGardeInventory.Utils.SIGObservation;
import fr.lille.inria.adam.lifl.EcoGardeInventory.scrapper.User;
import fr.lille.inria.adam.lifl.EcoGardeInventory.scrapper.cache.CachedClientSIGService;
import fr.lille.inria.adam.lifl.EcoGardeInventory.scrapper.cache.IClientSIGBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

/**Cette activité abstraite est en charge des opérations usuelles du cycle
 * de vie d'une activité qui sert à construire une observation.
 * Elle s'occupe de la connexion avec le SIGService, la récupération de 
 * l'observation et du user depuis l'Intent, la sauvegarde et la 
 * restauration d'état de l'activité (changement d'app, changement 
 * d'orientation etc), libération des ressources etc 
 * @author liabeuf
 */
public class BuildObservationActivity extends Activity {
	protected User user;
	protected SIGObservation observationEnCoursDeRealisation = null;
	protected IClientSIGBinder clientBinder;
	protected boolean isClientSIGBounded = false;
	private ServiceConnection clientSIGServConn = null;
	
	/**Cette méthode est appelée lors de la création de l'activité.
	 * Elle doit renvoyer une implémtentation de ServiceConnecion qui 
	 * permettra de définir les opérations à effectuer lorsque la 
	 * connexion au Service ClientSIG sera opérationnelle.
	 * @return
	 */
	protected ServiceConnection initializeClientSIGServConn() { return null; }
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		// On encapsule pour une meilleure maitrise
		// et pour hooker l'injection du User dans le SIGService
		// je fais cette injection car Android peut couper le service quand ça 
		// lui chante mais ne propose pas de mécanisme de restauration d'état!
		// (comme pour les Activity avec onSaveInstanteState)
		final ServiceConnection decoredConn = initializeClientSIGServConn();
		clientSIGServConn = new ServiceConnection() {
			@Override
			public void onServiceDisconnected(ComponentName name) {
				if (decoredConn != null) decoredConn.onServiceDisconnected(name);
				isClientSIGBounded=false;
				clientBinder = null;
			}
			
			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				clientBinder = (IClientSIGBinder) service;
				if (user != null) clientBinder.setUser(user);
				if (decoredConn != null) decoredConn.onServiceConnected(name, service);
			}
		};
		
		prepareObservation();
		prepareUser();
	}
	
	/**Récupere l'Observation depuis l'Intent ou la crée
	 */
	private void prepareObservation() {
		if (observationEnCoursDeRealisation==null) {
			try {
				observationEnCoursDeRealisation=getIntent().getExtras().getParcelable("SIG_OBSERVATION");
			} catch(Exception e) { } finally {
				if (observationEnCoursDeRealisation==null) {
					observationEnCoursDeRealisation=new SIGObservation();
					Log.w("BuildObservationActivity.prepareObs", "Nouvelle observation crée!");
				}
			}
		}
	}
	
	/**Récupère le User depuis l'Intent. Hormis à la page de Login
	 * il devrait toujours y avoir un User à récupérer.
	 */
	private void prepareUser() {
		if (user==null) {
			try {
				user = getIntent().getExtras().getParcelable("SIG_USER");
			} catch(Exception e) {
				Log.w("BuildObservationActivity.prepareUser", "Pas de user");
			}
		}
	}
	
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putParcelable("observation", observationEnCoursDeRealisation);
		outState.putParcelable("user", user);
	}
	
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		observationEnCoursDeRealisation = savedInstanceState.getParcelable("observation");
		user = savedInstanceState.getParcelable("user");
	}
	
	
	
	@Override
	protected void onStart() {
		super.onStart();
		
		// Invocation du Service en charge du proxing avec le serveur SIGNature
		// Le reste de onStart se situe dans initializeClientSIGServConn()
		Intent proxyServiceIntent = new Intent(this, CachedClientSIGService.class);
		isClientSIGBounded = bindService(proxyServiceIntent, this.clientSIGServConn, BIND_AUTO_CREATE);
	}
	
	@Override
	protected void onStop() {
		super.onStop();
		if (isClientSIGBounded) { unbindService(clientSIGServConn); }
	}
}
